﻿using System.Collections.Generic;
using MIAP.Entidades;

namespace MIAP.DataAccess.Interfaces
{
    /// <summary>
    /// Contrato del DAO de procesos de SolicitudRecargaArchivoDao.
    /// </summary>
    public interface ISolicitudRecargaArchivoDao
    {
        /// <summary>
        /// Obtiene todos los archivos que el usuario pueda cargar. 
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto con el que deberán estar relacionados los archivos.</param>
        /// <param name="idUsuario">Es el id del usuario con el cual deberán estar relacionados los archivos.</param>
        /// <returns>Lista de archivos.</returns>
        IList<CatalogoInfo> GetArchivosByUsuarioProyecto(int idProyecto, int? idUsuario);

        /// <summary>
        /// Obtiene los archivos relacionados con el usuario a los que se les puede levantar una solicitud de recarga.
        /// </summary>
        /// <param name="filtroSolicitud">Filtros aplicados a la consulta.</param>        
        /// <returns>Lista de archivos</returns>
        IList<SolicitudRecargaArchivoInfo> GetArchivosRecarga(SolicitudRecargaArchivoInfo filtroSolicitud);

        /// <summary>
        /// Guarda una solicitud de recarga de archivo.
        /// </summary>
        /// <param name="solicitud">Solicitud que será guardada.</param>
        /// <param name="user">Usuario que ejecuta la operación.</param>
        void AddSolicitudRecarga(SolicitudRecargaArchivoInfo solicitud, string user);

        /// <summary>
        /// Obtiene las versiones de los archivos que tienen una solicitud con estatus pendiente o autorizada
        /// </summary>
        /// <returns>Lista de ids de bitácora general.</returns>
        IList<CatalogoInfo> GetVersionArchivoEnSolicitud();

        /// <summary>
        /// Obtiene las solicitudes con estatus pendiente.
        /// </summary>
        /// <param name="idAutorizador">Es el id del autorizador por el que se filtrarán los archivos.</param>
        /// <returns>Lista de solicitudes con estatus pendiente</returns>
        IList<SolicitudRecargaArchivoInfo> GetSolicitudesPendientes(int idAutorizador);

        /// <summary>
        /// Obtiene el nombre del solicitante de la solicitud de recarga de archivo.
        /// </summary>
        /// <param name="listIdsSolicitudes">Lista de ids de solicitudes.</param>
        /// <returns>Lista de ids de slicitudes y sus respectivos solicitantes.</returns>
        IList<CatalogoInfo> GetNombreSolicitante(List<int> listIdsSolicitudes);

        /// <summary>
        /// Obtiene el nombre del usuario que cargo, recargo o versiono el archivo.
        /// </summary>
        /// <param name="listUsuariosVersionadores">Lista de los usuarios que varsionarón  cargaron los archivos.</param>
        /// <returns>Lista con los nombres de los usuarios.</returns>
        IList<EjecutorInfo> GetNombreVersionador(List<EjecutorInfo> listUsuariosVersionadores);

        /// <summary>
        /// Modifica el estatus de la solicitud.
        /// </summary>
        /// <param name="solicitud">Es la información de la solicitud que será modificada.</param>
        /// <param name="autorizarSolicitud">Indicador si a solicitud fue autorizada.</param>
        /// <param name="user">Usuario que ejecuta la operación.</param>        
        void EditEstatusSolicitud(SolicitudRecargaArchivoInfo solicitud, bool autorizarSolicitud, string user);

        /// <summary>
        /// Obtiene las direcciones de correo de los autorizadores de archivo.
        /// </summary>
        /// <param name="idArchivo">Es el id del archivo.</param>
        /// <returns>Lista de direcciones de correo de los autorizadores del archivo.</returns>
        IList<string> GetCorreosAutorizadoresByArchivo(int idArchivo);
    }
}
